Skip to main content

第 3 章:使用 Ansible 模組

Ansible Modules 模組種類

約有 12 種,從套件 (Packaging)、資料庫 (Database)、通知 (Notification)、雲端 (Cloud)、Windows 到網路 (Network) 等。要是找不到想要的功能,我們還可以透過 command 和 shell 等 Modules 自行擴充。

模組使用方法

  1. 進入 Ansible Documentation 網站
  2. 於左側點選 Module Index 的連結
  3. 於左側點選 Commands Modules 的連結
  4. 於內容頁點選 command 的連結
  5. 進到 command module 文件後,可先跳過上述的簡介
  6. 將畫面移至捲至下方的範例 (Examples),先看看是不是我們要的功能
  7. 接著看選項表 (Options),它會列出必需使用的參數和各參數的預設值
  8. 最後記得瞄一下大綱 (Synopsis),這邊常常會提到些注意事項,例如要用 apt module 必需先滿足安裝 python-apt 或 python3-apt 的套件才行

常用的 Ansible Module

apt

apt module 是給 Debian, Ubuntu 等作業系統 (OS) 使用的套件模組 (Packaging Modules),我們可以透過它管理 apt 套件。其類似的 Linux 指令有 aptapt-getaptitude 和 dpkg

更新套件索引 (快取),等同於 apt-get update 指令
- name: Update repositories cache
apt:
update_cache: yes
安裝 vim 套件
- name: Install the package "vim"
apt:
name: vim
state: present
移除 nano 套件
 - name: Remove "nano" package
apt:
name: nano
state: absent

command

command module 是個可以在遠端上執行指令的指令模組 (Commands Modules),剛入門 Ansible 會用 module 不多?只要 Linux Shell 會通的指令都可以透過它使用。但它不支援變數 (variables) 和 <>|; 和 & 等運算,若有這類需求請改用 shell module。

重新開機
- name: Reboot at now
command: /sbin/shutdown -r now
當某個檔案不存在時才執行該指令
- name: create .ssh directory
command: mkdir .ssh creates=.ssh/
先切換目錄再執行指令
- name: cat /etc/passwd
command: cat passwd
args:
chdir: /etc

copy

copy module 是從本地複製檔案到遠端的檔案模組 (Files Modules),若有使用變數需求者,可改用 template module,這部份凍仁會在第 14 章提到。其類似的 Linux 指令為 scp

複製 ssh public key 到遠端 (chmod 644 /target/file)
- name: copy ssh public key to remote node
copy:
src: files/id_rsa.pub
dest: /home/docker/.ssh/authorized_keys
owner: docker
group: docker
mode: 0644
複製 ssh public key 到遠端 (chmod u=rw,g=r,o=r /target/file)
- name: copy ssh public key to remote node
copy:
src: files/id_rsa.pub
dest: /home/docker/.ssh/authorized_keys
owner: docker
group: docker
mode: "u=rw,g=r,o=r"
複製 nginx vhost 設定檔到遠端,並備份原有的檔案
- name: copy nginx vhost and backup the original
copy:
src: files/ironman.conf
dest: /etc/nginx/sites-available/default
owner: root
group: root
mode: 0644
backup: yes

file

file module 是在遠端建立和刪除檔案 (file)、目錄 (directory)、軟連結 (symlinks) 的檔案模組 (Files Modules)。其類似的 Linux 指令為 chownchownlnmkdir 和 touch

建立檔案 touch,並設定檔案權限為 644
- name: touch a file, and set the permissions
file:
path: /etc/motd
state: touch
mode: "u=rw,g=r,o=r"
建立目錄 mkdir,並設定檔案擁有者為 docker
- name: create a directory, and set the permissions
file:
path: /home/docker/.ssh/
state: directory
owner: docker
mode: "700"
建立軟連結 ln
- name: create a symlink file
file:
src: /tmp
dest: /home/docker/tmp
state: link

lineinfile

lineinfile module 是個可用正規表示式對檔案進行插入或取代文字的檔案模組 (Files Modules)。其類似的 Linux 指令為 sed

移除 docker 使用者的 sudo 權限
- name: remove sudo permission of docker
lineinfile:
dest: /etc/sudoers
state: absent
regexp: '^docker'
在 /etc/hosts 檔案裡用 127.0.0.1 localhost 取代開頭為 127.0.0.1 的一行
- name: set localhost as 127.0.0.1
lineinfile:
dest: /etc/hosts
regexp: '^127\.0\.0\.1'
line: '127.0.0.1 localhost'
owner: root
group: root
mode: 0644

srvice

service module 是個用來管理遠端系統服務的系統模組 (System Modules)。其類似的 Linux 指令為 service

啟用 nginx
- name: start nginx service
service:
name: nginx
state: started
停止 nginx
- name: stop nginx service
service:
name: nginx
state: stopped
重開網路服務
- name: restart network service
service:
name: network
state: restarted
args: eth0

shell

shell module 是可以在遠端用 /bin/sh 執行指令的指令模組 (Commands Modules),支援變數 (variables) 和 <>|; 和 & 等運算。

藉由 ls 和 wc 檢查檔案數量
- name: check files number
shell: ls /home/docker/ | wc -l
把所有的 Python 行程給砍掉
- name: kill all python process
shell: kill -9 $(ps aux | grep python | awk '{ print $2 }')

stat

stat module 是用來檢查檔案狀態的檔案模組 (Files Modules)。其類似的 Linux 指令為 stat

檢查檔案是否存在,若不存在則建立它
- name: check the 'vimrc' target exists
stat:
path: /home/docker/.vimrc
register: stat_vimrc

- name: touch vimrc
file:
path: /home/docker/.vimrc
state: touch
mode: "u=rw,g=r,o=r"
when: stat_vimrc.stat.exists == false
取得某檔案的 md5sum
  stat:
path: /path/to/something
checksum_algorithm: md5sum